<?php

App::import('Model', 'products.Product');
App::import('Model', 'categories.Category');
App::import('Model', 'contacts.Contact');
class ProductsController extends AppController {

    var $name = 'Products';
    var $uses = array('products.Product', 'products.ProductCategory','contacts.Contact');
    var $view = 'Theme';
    var $theme = 'qat';
    var $helpers = array('text');
    var $layout	= 'products';
    var $components = array('RequestHandler', 'Email');
    /**
      @var $model
      @brief Thông tin về model, được sử dụng trong trường hợp override thông tin của danh mục
     */
    var $models = array(
        'Category' => array(
            'plugin' => 'products',
            'name' => 'ProductCategory'
        ),
        'Page' => array(
            'plugin' => 'products',
            'name' => 'Product'
        )
    );

    function beforeFilter() {
        parent::beforeFilter();
        $this->configs = $this->{$this->models['Page']['name']}->loadConfig();        
        $this->set('configs', $this->configs);
        $this->category_root_id = $this->configs['Category']['root_id'];
    }

    function index($alias = null) {
        
    }

    //Lấy các sản phẩm trong mỗi danh mục đó
    function listproducts($alias = null) {

        if ($alias == null) {
            $product_category = $this->{$this->models['Category']['name']}->find('first', array(
                'fileds' => array('id', 'name', 'alias'),
                'contain' => false,
                    ));
//			debug($category_produc); exit;
            $this->paginate[$this->models['Page']['name']] = array(
                'fields' => array('id', 'title', 'alias', 'description', 'content', 'image','price', 'ProductCategory.alias'),
                'joins' => array(
                    array(
                        'table' => 'products_middle',
                        'type' => 'INNER',
                        'alias' => 'ReferenceCategory',
                        'conditions' => array(
                            "Product.id = ReferenceCategory.page_id"
                        )
                    ),
                    array(
                        'table' => 'product_categories',
                        'type' => 'INNER',
                        'alias' => 'ProductCategory',
                        'conditions' => array(
                            "ProductCategory.id = ReferenceCategory.category_id"
                        )
                    )
                ),
                'order' => "Product.priority desc",
                'conditions' => array('Category.alias' => $category_product['ProductCategory']['alias']),
                'limit' => 6,
                'contain' => array()
            );
        } else {
            $product_category = $this->{$this->models['Category']['name']}->find('first', array(
                'fileds' => array('id', 'name', 'alias'),
                'conditions' => array(
                    "{$this->models['Category']['name']}.alias" => $alias,
                ),
                'contain' => false,
                    ));
            $this->paginate[$this->models['Page']['name']] = array(
                'fields' => array('id', 'title', 'alias', 'description', 'content', 'image','price', 'is_published', 'ProductCategory.alias', 'ProductCategory.name'),
                'conditions' => array(
                    'ProductCategory.alias' => $alias,
                    'is_published' => 1
                ),
                'order' => 'Product.created desc',
                'joins' => array(
                    array(
                        'table' => 'products_middle',
                        'type' => 'INNER',
                        'alias' => 'ReferenceCategory',
                        'conditions' => array(
                            "Product.id = ReferenceCategory.page_id"
                        )
                    ),
                    array(
                        'table' => 'product_categories',
                        'type' => 'INNER',
                        'alias' => 'ProductCategory',
                        'conditions' => array(
                            "ProductCategory.id = ReferenceCategory.category_id"
                        )
                    )
                ),
                'limit' => 6,
                'contain' => false
            );
        }
        $record = $this->paginate($this->models['Page']['name']);
        //debug($record); exit;
        $this->set('products', $record);
        $product_categories = $this->ProductCategory->find('all', array(
            'fileds' => array('id', 'name', 'alias'),
            'contain' => false
                ));
        $this->set('product_category', $product_category);
        $this->set('product_categories', $product_categories);
    }

    function search() {
        $search_key = '';
        if (isset($this->data['Search']['key'])) {
            $search_key = $this->data['Search']['key'];
        }
        $this->paginate = array(
            'conditions' => array(
                "OR" => array(
                    'Product.title LIKE' => "%" . $search_key . "%",
                    'Product.description LIKE' => "%" . $search_key . "%",
                    'Product.content LIKE' => "%" . $search_key . "%",
                ),
                'is_published' => 1,
            ),
            'fields' => array('Product.id', 'Product.alias', 'Product.title', 'Product.created', 'Product.description', 'Product.image', 'ProductCategory.name', 'ProductCategory.alias','price'),
            'contain' => array(),
            'limit' => 12,
            'order' => 'Product.created desc',
            'joins' => array(
                array(
                    'table' => 'products_middle',
                    'type' => 'INNER',
                    'alias' => 'ReferenceCategory',
                    'conditions' => array(
                        "Product.id = ReferenceCategory.page_id"
                    )
                ),
                array(
                    'table' => 'product_categories',
                    'type' => 'INNER',
                    'alias' => 'ProductCategory',
                    'conditions' => array(
                        "ProductCategory.id = ReferenceCategory.category_id"
                    )
                ),
            ),
        );
        $products = $this->paginate('Product');
        $this->set('products', $products);
        $this->set('search_key', $search_key);
        $product_categories = $this->ProductCategory->find('all', array(
            'fileds' => array('id', 'name', 'alias'),
            'contain' => false
                ));
        $this->set('product_categories', $product_categories);
    }

    function view($alias, $category_alias = '') {
        if (!$alias) {
            $this->Session->setFlash(__("Không đúng mã sản phẩm", true));
            $this->redirect(array('controller'=>'home'));
        } else {
            $this->Product->Behaviors->attach('Containable');
            $article = $this->Product->find('first', array(
                'conditions' => array(
                    "Product.alias" => $alias,
                    "Product.is_published" => 1
                ),
                'fields' => array('id', 'title', 'content', 'price', 'description', 'image', 'Category.id', 'Category.name', 'alias', 'created'),
                'order' => "Product.priority desc",
                'joins' => array(
                    array(
                        'table' => $this->Product->hasAndBelongsToMany['Category']['joinTable'],
                        'type' => 'INNER',
                        'alias' => 'Middle',
                        'conditions' => array(
                            "Middle.page_id = Product.id"
                        )
                    ),
                    array(
                        'table' => $this->{$this->models['Category']['name']}->table,
                        'type' => 'INNER',
                        'alias' => 'Category',
                        'conditions' => array(
                            'Middle.category_id = Category.id'
                        )
                    ),
                )
                    ));

            $this->set('article', $article);
            //debug($article); exit;

            $other_products = $this->Product->find('all', array(
                'conditions' => array(
                    "Product.alias <>" => $alias,
                    "Product.is_published" => 1
                ),
                'fields' => array('title', 'alias', 'description', 'image', 'Category.alias'),
                'order' => "Product.priority desc",
                'limit' => 6,
                'joins' => array(
                    array(
                        'table' => $this->Product->hasAndBelongsToMany['Category']['joinTable'],
                        'type' => 'INNER',
                        'alias' => 'Middle',
                        'conditions' => array(
                            "Middle.page_id = Product.id"
                        )
                    ),
                    array(
                        'table' => $this->{$this->models['Category']['name']}->table,
                        'type' => 'INNER',
                        'alias' => 'Category',
                        'conditions' => array(
                            'Middle.category_id = Category.id'
                        )
                    ),
                )
                    ));
            $this->set('other_products', $other_products);
        }
    }
    // function
    // add to cart
    // code by dunghd
    // 23/04/2012
    function add_cart($alias, $category_alias = '') {
        if (!$alias) {
            $this->Session->setFlash(__("Không đúng mã sản phẩm", true));
            $this->redirect(array('controller'=>'home'));
        } else {
            // Add to session
            $this->Session->setFlash(__('Thêm sản phẩm thành công!',true), "flash_success");
            
            // get current cart
            $cart = $this->Session->read('cart');
            if( empty($cart) )
            {                
                $cart = array(
                    'total' => 1,
                    'items' => array(
                        $alias => '1',
                    )
                 );
                 $this->Session->write('cart',$cart);
                 
            }
            else
            {                
                if(array_key_exists($alias, $cart['items'] ))
                {
                    $cart['items'][$alias] = $cart['items'][$alias] + 1;
                }
                else
                {
                     $cart['items'][$alias] = 1;
                }               
                $cart['total'] = $cart['total'] + 1;
                $this->Session->write('cart',$cart);
            }
            $this->redirect(array('action'=>'cart'));
        }
    }
    
    // function
    // add to cart
    // code by dunghd
    // 23/04/2012
    function remove($alias, $category_alias = '') {
        if (!$alias) {
            $this->Session->setFlash(__("Không đúng mã sản phẩm", true));
            $this->redirect(array('controller'=>'home'));
        } else {
            // Add to session
            $this->Session->setFlash(__('Thêm sản phẩm thành công!',true), "flash_success");
            
            // get current cart
            $cart = $this->Session->read('cart');
            if( empty($cart) )
            {                
                $cart = array(
                    'total' => 1,
                    'items' => array(
                        $alias => '1',
                    )
                 );
                 $this->Session->write('cart',$cart);
                 
            }
            else
            {                
                if(array_key_exists($alias, $cart['items'] ))
                {
                    unset($cart['items'][$alias]);
                }
                $total = 0;
                foreach($cart['items'] as $qty)
                {
                    $total+= $qty;                    
                }              
                $cart['total'] = $total;
                $this->Session->write('cart',$cart);
            }
            $this->redirect(array('action'=>'cart'));
        }
    }
    
    function process()
    {
              
        $cart = $this->Session->read('cart');   
        $checkout = array();
        $sum = 0;
        $html = '. Đơn đặt hàng của tôi gồm : ';
        foreach($cart['items'] as $item => $qty)
        {
            $prod = $this->Product->find('first', array(
                'conditions' => array(
                    "Product.alias" => $item,
                    "Product.is_published" => 1
                ),
                'fields' => array('id', 'title', 'content', 'price', 'description', 'image', 'Category.id', 'Category.name', 'alias', 'created'),
                'order' => "Product.priority desc",
                'joins' => array(
                    array(
                        'table' => $this->Product->hasAndBelongsToMany['Category']['joinTable'],
                        'type' => 'INNER',
                        'alias' => 'Middle',
                        'conditions' => array(
                            "Middle.page_id = Product.id"
                        )
                    ),
                    array(
                        'table' => $this->{$this->models['Category']['name']}->table,
                        'type' => 'INNER',
                        'alias' => 'Category',
                        'conditions' => array(
                            'Middle.category_id = Category.id'
                        )
                    ),
                )
                    ));
                    
             $html.= 'Sản phẩm ' . $prod['Product']['title'] . ' số lượng là '.$qty. ' giá ' . $prod['Product']['price'] . '.';    
        }        
        $this->data['Contact']['content'].= $html;
        if(!empty($this->data)) {
			$this->Contact->set($this->data);
			/**
			 * Tiến hành kiểm tra tính hợp lệ được khai báo ràng buộc trong Model
			 **/
			if($this->Contact->validates()) {
			//	if ($this->Captcha->protect(false, 'Contact') || !$this->configs['Captcha']['isActive']) {
					/**
					 * Nếu : --lưu thành công dữ liệu thì hiển thị thông báo và điều hướng về trang index
					 * 		 --không thành công thì thông báo lỗi và yêu cầu thực hiện lại thao tác
					 */
                    
                    
					if($this->Contact->save($this->data)) {
						// Email
                        $contactconfigs = $this->Contact->loadConfig();
						$receiver = $contactconfigs['Contact']['receiver'];
						$subject = "{$_SERVER['HTTP_HOST']} - Có thông tin liên lạc mới";
						$message = "Bạn có thể xem các thông tin liên lạc khác bằng cách vào đây:<br />
							<a href=\"http://{$_SERVER['HTTP_HOST']}".$this->webroot."contacts/manage_contacts\">http://{$_SERVER['HTTP_HOST']}".$this->webroot."contacts/manage_contacts</a><strong><br />
							<br />
							Người gửi</strong>: {$this->data['Contact']['name']}<br />
							<strong>Email</strong>: {$this->data['Contact']['email']}<br />
							<strong>Tiêu đề</strong>: {$this->data['Contact']['title']}<br />
							<strong>Nội dung</strong>:<br />
							{$this->data['Contact']['content']}";
						
						$this->Email->sendAs = 'html';
						$this->Email->headers = array(
							'From'	=>	$contactconfigs['Contact']['from'],
							'Reply-To'	=>	$contactconfigs['Contact']['reply_to'],
						);
						$this->Email->to = $receiver;
						$this->Email->subject = $subject;
						$this->Email->send($message);
						$cart = array(
                            'total' => 0,
                            'items' => array(                   
                            )
                         );
                         $this->Session->write('cart',$cart);    
						// redirect
						$this->redirect(array('plugin' => 'contacts', 'controller' => 'contacts', 'action' => 'thanks'));
					} else{
						$this->Session->setFlash(__('Không thể lưu thông tin liên lạc. Bạn vui lòng thử lại!'), "flash_error");
					    $this->redirect('/order');
                    }
				//} else {
				//	$this->Contact->invalidate('captcha', __("Mã bảo mật không hợp lệ", true));
				//}
			}
            else {
                 //$this->Session->setFlash(__('Không thể lưu thông tin liên lạc. Bạn vui lòng thử lại!'), "flash_error");
                 $this->redirect('/order');
            }
		}
        else
        {
            $this->redirect('/order');
        }
    }
    
    // show shopping cart
    // dunghd code 24/04/2012
    //
    function cart()
    {
         $this->layout = 'default';
         $products = ClassRegistry::init('products.Product')->find('all', array(
            'conditions' => array("Product.is_published"	=>1,"Product.special"	=>1),
            'limit' => '3',
	        'order'		=> array(
							'Product.news_date desc',
							'Product.created desc'
						),
            'contain'		=> array()
                )
            ); 
        $cart = $this->Session->read('cart');   
        $checkout = array();
        $sum = 0;
        foreach($cart['items'] as $item => $qty)
        {
            $prod = $this->Product->find('first', array(
                'conditions' => array(
                    "Product.alias" => $item,
                    "Product.is_published" => 1
                ),
                'fields' => array('id', 'title', 'content', 'price', 'description', 'image', 'Category.id', 'Category.name', 'alias', 'created'),
                'order' => "Product.priority desc",
                'joins' => array(
                    array(
                        'table' => $this->Product->hasAndBelongsToMany['Category']['joinTable'],
                        'type' => 'INNER',
                        'alias' => 'Middle',
                        'conditions' => array(
                            "Middle.page_id = Product.id"
                        )
                    ),
                    array(
                        'table' => $this->{$this->models['Category']['name']}->table,
                        'type' => 'INNER',
                        'alias' => 'Category',
                        'conditions' => array(
                            'Middle.category_id = Category.id'
                        )
                    ),
                )
                    ));
            $checkout[$item] = array(
                'title' => $prod['Product']['title'],
                'alias' => $prod['Product']['alias'],
                'qty' => $qty,
                'price' => $prod['Product']['price'],
                'total' => $prod['Product']['price'] * $qty
             );
            $sum += $prod['Product']['price'] * $qty;
        }        
		$this->set(compact('products','checkout','sum'));
        
    }
    
    // order and send information to admin
    // dunghd code 24/04/2012
    function order()
    {
        $this->layout = 'news';         
        $cart = $this->Session->read('cart');   
        $checkout = array();
        $sum = 0;
        foreach($cart['items'] as $item => $qty)
        {
            $prod = $this->Product->find('first', array(
                'conditions' => array(
                    "Product.alias" => $item,
                    "Product.is_published" => 1
                ),
                'fields' => array('id', 'title', 'content', 'price', 'description', 'image', 'Category.id', 'Category.name', 'alias', 'created'),
                'order' => "Product.priority desc",
                'joins' => array(
                    array(
                        'table' => $this->Product->hasAndBelongsToMany['Category']['joinTable'],
                        'type' => 'INNER',
                        'alias' => 'Middle',
                        'conditions' => array(
                            "Middle.page_id = Product.id"
                        )
                    ),
                    array(
                        'table' => $this->{$this->models['Category']['name']}->table,
                        'type' => 'INNER',
                        'alias' => 'Category',
                        'conditions' => array(
                            'Middle.category_id = Category.id'
                        )
                    ),
                )
                    ));
            $checkout[$item] = array(
                'title' => $prod['Product']['title'],
                'alias' => $prod['Product']['alias'],
                'qty' => $qty,
                'price' => $prod['Product']['price'],
                'total' => $prod['Product']['price'] * $qty
             );
            $sum += $prod['Product']['price'] * $qty;
        }        
		$this->set(compact('checkout','sum'));
    }

}

?>